<?php
/**
 * Created by PhpStorm.
 * User: dt
 * Time: 16:53
 */
namespace common\base;

use common\models\UserIpModel;
use frontend\utils\AliyunSms\Sms;
use yii\helpers\ArrayHelper;
use yii\web\Controller;
use Yii;
use yii\base\Exception;


/**
 * 控制器基类
 * @package app\base
 */
class BController extends Controller
{
    //存储request请求体
    public $body = [];
    //存储data
    public $data = [];
    public $title;

    public function beforeAction($action){
        $this->enableCsrfValidation=false;
        $this->body();
        $route = [//请求路由
           'controller' => $action->controller->id,
           'action' => $action->id,
        ];
       return true;
    }

    public function saveUserIp($source)
    {
        $ip = $this->getUserIp();
        $address = $this->ipToCityTaoBao($ip);
        $browser = $this->getBrowser();
        $os = $this->getOs();
        $user_ip_model = new UserIpModel(['scenario' => 'add']);
        $user_ip_model->load(['ip'=>$ip,'source'=>$source,'address'=>$address,'browser'=>$browser,'os'=>$os], '');
        $user_ip_model->validate();
        $user_ip_model->save();
    }

    public function getUserIp()
    {
        if (isset($_SERVER)) {
            if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
                $realip = $_SERVER['HTTP_CLIENT_IP'];
            } else {
                $realip = $_SERVER['REMOTE_ADDR'];
            }
        } else {
            //不允许就使用getenv获取
            if (getenv("HTTP_X_FORWARDED_FOR")) {
                $realip = getenv("HTTP_X_FORWARDED_FOR");
            } elseif (getenv("HTTP_CLIENT_IP")) {
                $realip = getenv("HTTP_CLIENT_IP");
            } else {
                $realip = getenv("REMOTE_ADDR");
            }
        }
        return $realip;
    }

    /*
     * redis 缓存
     */
    public function redisSet($key,$query,$time=86400)
    {
        if(is_array($query)){
            $query = json_encode($query);
        }
        Yii::$app->redis->set($key,$query);
        Yii::$app->redis->expire($key,$time);
    }

    public function redisGet($key,$flag = false)
    {
        $res = Yii::$app->redis->get($key);
        if($flag == true){
            $res = json_decode($res,true);
        }
        return $res;
    }


    /***
     * 存储body体与data数据
     * @return bool
     */
    protected function body()
    {
        if(Yii::$app->request->isPost){
            $this->body=Yii::$app->request->post();
            return true;
        }
        if(Yii::$app->request->isGet){
            $this->body=Yii::$app->request->get();
            return true;
        }
        return false;
    }

    /**
     * 统一JSON返回
     * @param $errIndex
     * @param array $data
     * @return array
     * @throws Exception
     */
    protected function ajaxReturn($errIndex, $data = [])
    {
        if (empty(Yii::$app->params[$errIndex])) {
            $errorMsg = json_encode([
                'code' => Yii::$app->params['params_error']['code'],
                'message' => "未找到返回信息索引[{$errIndex}]",
                'data' => [],
            ],JSON_UNESCAPED_UNICODE);
            throw new Exception($errorMsg);
        }
        $error = Yii::$app->params[$errIndex];
        return [
            'code' => $error['code'],
            'message' => $error['info'],
            'data' => $data
        ];
    }

    /**
     * 统一返回自定义错误信息
     * @param $errIndex
     * @param array $data
     * @return array
     * @throws Exception
     */
    protected function ajaxCustom($code, $error,$data = [])
    {
        return [
            'code' => $code,
            'message' => $error,
            'data' => $data
        ];
    }

    /**
     * 数据安全处理
     * @param     array/string    $data    需要处理的数据
     * @return    array/string    $data    处理后的数据
     */
    public static function parseData($data)
    {
        if(is_array($data)){
            foreach ($data as $k => $v) {
                if(is_array($v)){
                    $data[$k] = self::parseData($v);
                }else if (is_string($v)) {
                    $data[$k] = trim(htmlspecialchars(addslashes($v)));
                }
            }
        }else if (is_string($data)) {
            $data = trim(htmlspecialchars(addslashes($data)));
        }
        return $data;
    }

    public function get($name=null,$default=null){
        return Yii::$app->request->get($name,$default);
    }
    
    public function post($name=null,$default=null){
        if($name===null){
            $post = Yii::$app->request->post();
            if(!empty($post)){
                return $post;
            }
            return Yii::$app->request->get();
        }else{
            $post = Yii::$app->request->post($name,$default);
            if($post){
                return $post;
            }
            return Yii::$app->request->get($name,$default);
        }
    }

    /**
     * 根据IP，获取省份名和城市名
     * @param $ip
     */
    public function ipToCityTaoBao($ip){
        if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/',$ip)){
            return false;
        }
        $add = UserIpModel::find()->select(['address'])->where(['ip'=>$ip])->asArray()->one();
        if(!empty($add)){
            $address = $add['address'];
        }else {
            try {
                $url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip;
                $flag = @file_get_contents($url);
                if($flag){
                    $res = json_decode(file_get_contents($url));
                    $res = ArrayHelper::toArray($res);
                    if (isset($res['code']) && $res['code'] == 0) {
                        $ret['country'] = isset($res['data']['country']) ? $res['data']['country'] : '';
                        $ret['province'] = isset($res['data']['region']) ? $res['data']['region'] : '';
                        $ret['city'] = isset($res['data']['city']) ? $res['data']['city'] : '';
                        $ret['county'] = isset($res['data']['county']) && $res['data']['county'] != 'XX' ? $res['data']['county'] : '';
                    } else {
                        return false;
                    }
                    $address = implode('-', array_filter($ret));
                }else{
                   $address = '未知'; 
                }
            }catch (\yii\db\Exception $exception){
                throw $exception;
            }
        }
        return $address;
    }

    /**
     * 获取客户端浏览器信息 添加win10 edge浏览器判断
     * @param  null
     * @author  Jea杨
     * @return string
     */
    function getBrowser()
    {
        $sys = $_SERVER['HTTP_USER_AGENT'];  //获取用户代理字符串
        if (stripos($sys, "Firefox/") > 0) {
            preg_match("/Firefox\/([^;)]+)+/i", $sys, $b);
            $exp[0] = "Firefox";
            $exp[1] = $b[1];  //获取火狐浏览器的版本号
        } elseif (stripos($sys, "Maxthon") > 0) {
            preg_match("/Maxthon\/([\d\.]+)/", $sys, $aoyou);
            $exp[0] = "傲游";
            $exp[1] = $aoyou[1];
        } elseif (stripos($sys, "MSIE") > 0) {
            preg_match("/MSIE\s+([^;)]+)+/i", $sys, $ie);
            $exp[0] = "IE";
            $exp[1] = $ie[1];  //获取IE的版本号
        } elseif (stripos($sys, "OPR") > 0) {
            preg_match("/OPR\/([\d\.]+)/", $sys, $opera);
            $exp[0] = "Opera";
            $exp[1] = $opera[1];
        } elseif (stripos($sys, "Edge") > 0) {
            //win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
            preg_match("/Edge\/([\d\.]+)/", $sys, $Edge);
            $exp[0] = "Edge";
            $exp[1] = $Edge[1];
        } elseif (stripos($sys, "Chrome") > 0) {
            preg_match("/Chrome\/([\d\.]+)/", $sys, $google);
            $exp[0] = "Chrome";
            $exp[1] = $google[1];  //获取google chrome的版本号
        } elseif (stripos($sys, 'rv:') > 0 && stripos($sys, 'Gecko') > 0) {
            preg_match("/rv:([\d\.]+)/", $sys, $IE);
            $exp[0] = "IE";
            $exp[1] = $IE[1];
        } else {
            $exp[0] = "未知浏览器";
            $exp[1] = "";
        }
        return $exp[0] . '(' . $exp[1] . ')';
    }

    /**
     * 获取客户端操作系统信息包括win10
     * @param  null
     * @author  Jea杨
     * @return string
     */
    function getOs()
    {
        $agent = $_SERVER['HTTP_USER_AGENT'];
        $os = false;
        if (preg_match('/win/i', $agent) && strpos($agent, '95')) {
            $os = 'Windows 95';
        } else if (preg_match('/win 9x/i', $agent) && strpos($agent, '4.90')) {
            $os = 'Windows ME';
        } else if (preg_match('/win/i', $agent) && preg_match('/98/i', $agent)) {
            $os = 'Windows 98';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.0/i', $agent)) {
            $os = 'Windows Vista';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.1/i', $agent)) {
            $os = 'Windows 7';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 6.2/i', $agent)) {
            $os = 'Windows 8';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 10.0/i', $agent)) {
            $os = 'Windows 10';#添加win10判断
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 5.1/i', $agent)) {
            $os = 'Windows XP';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt 5/i', $agent)) {
            $os = 'Windows 2000';
        } else if (preg_match('/win/i', $agent) && preg_match('/nt/i', $agent)) {
            $os = 'Windows NT';
        } else if (preg_match('/win/i', $agent) && preg_match('/32/i', $agent)) {
            $os = 'Windows 32';
        } else if (preg_match('/linux/i', $agent)) {
            $os = 'Linux';
        } else if (preg_match('/unix/i', $agent)) {
            $os = 'Unix';
        } else if (preg_match('/sun/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'SunOS';
        } else if (preg_match('/ibm/i', $agent) && preg_match('/os/i', $agent)) {
            $os = 'IBM OS/2';
        } else if (preg_match('/Mac/i', $agent) && preg_match('/PC/i', $agent)) {
            $os = 'Macintosh';
        } else if (preg_match('/PowerPC/i', $agent)) {
            $os = 'PowerPC';
        } else if (preg_match('/AIX/i', $agent)) {
            $os = 'AIX';
        } else if (preg_match('/HPUX/i', $agent)) {
            $os = 'HPUX';
        } else if (preg_match('/NetBSD/i', $agent)) {
            $os = 'NetBSD';
        } else if (preg_match('/BSD/i', $agent)) {
            $os = 'BSD';
        } else if (preg_match('/OSF1/i', $agent)) {
            $os = 'OSF1';
        } else if (preg_match('/IRIX/i', $agent)) {
            $os = 'IRIX';
        } else if (preg_match('/FreeBSD/i', $agent)) {
            $os = 'FreeBSD';
        } else if (preg_match('/teleport/i', $agent)) {
            $os = 'teleport';
        } else if (preg_match('/flashget/i', $agent)) {
            $os = 'flashget';
        } else if (preg_match('/webzip/i', $agent)) {
            $os = 'webzip';
        } else if (preg_match('/offline/i', $agent)) {
            $os = 'offline';
        } else {
            $os = '未知操作系统';
        }
        return $os;
    }
}